﻿#ifndef __SS_TIME_H__
#define __SS_TIME_H__
#include "../ssBaseDefine.h"
#ifndef _WIN32
#include <sys/time.h>
#endif
#include <time.h>

#define SS_TIME_STR_LEN 32

namespace StarSeeker
{

struct ssYMDHMS
{
	ST32_u year;
	ST32_u month;
	ST32_u day;
	ST32_u wday;
	ST32_u yday;
	ST32_u hour;
	ST32_u minute;
	ST32_u second;

	void Zero();
	bool IsZero();
	void GetLocalTime(char* buf);
	ST64_u GetTimestamp();
};

//mktime函数返回的时间戳是从1970年1月1日开始，已经按系统时区消去了时区影响
class ssTime
{
public:
	//获得当前时戳,以秒为单位,从1970年1月1日开始
	static ST64_u GetTimeNow();
	//获得当前时戳,以毫秒为单位,从1970年1月1日开始
	static ST64_u GetTimeNowMS();
	//获取当前时
	static tm* GetTime();
	static tm* GetTime(time_t timestamp);
	static void GetTime(ssYMDHMS& t);
	static void GetTime(time_t timestamp, ssYMDHMS& out);
	static time_t GetTimestamp(ssYMDHMS& t);
	//获取当前本地时
	static tm* GetLocalTime();
	static tm* GetLocalTime(time_t timestamp);
	static void GetLocalTime(ssYMDHMS& t);
	static void GetLocalTime(time_t timestamp, ssYMDHMS& out);
	//static time_t GetLocalTimestamp(ssYMDHMS& t);
	//格式化成字符串
	static void GetLocalTime(char* buf);
	//格式化成字符串: 年.月.日
	static void GetLocalTimeYMD(char* buf);
	//格式化成字符串: 年.月.日.时
	static void GetLocalTimeYMDH(char* buf);
	//格式化成字符串: 时:分:秒
	static void GetLocalTimeHMS(char* buf);
	//将日期格式化成数字
	static ST32_u GetDateNum(bool localTime);
	//将时间格式化成数字
	static ST32_u GetTimeNum(bool localTime);
	//设置时区（秒），默认+8
	static void SetTimeZone(time_t zone);
	//计算零点时间戳
	static ST64_u GetDayZero(time_t timestamp);
	//计算今日零点
	static ST64_u GetTodayZero();
	//计算日差
	static i32 GetDayDiff(time_t timestamp1, time_t timestamp2);
	//计算日差  每日的secondOfDay点为临界点
	static i32 GetDayDiff(time_t last, time_t now, i32 secondOfDay);
	//进程启动时间
	static time_t GetStart();
	//从1970年1月1日0时0分0到现在经过的天数(考虑本地时区)
	static u32 GetDays(time_t timestamp);
	//从1970年1月1日0时0分0到现在经过的周数(考虑本地时区)
	static u32 GetWeeks(time_t timestamp);
	//取周一0点时间秒
	static time_t GetMonday(time_t timestamp);
	//获取系统时区（秒）
	static time_t GetSystemTimeZone();
	//计算当前时间周几时间戳
	static time_t GetWeekDayTime(time_t timestamp, i32 weekday, i32 secondOfDay);
	//字符串转时间结构
	static ssYMDHMS StringToTimeStruct(const char* str, const char* format="%d-%d-%d %d:%d:%d");
	//设置时间偏移
	static void SetTimeOffset(time_t offset);
	static time_t SetTimeOffset(ssYMDHMS& offset);
	static time_t SetTimeOffset(const char* str);
private:
	//时区
	static time_t	s_timeZone;
	//系统时区
	static time_t	s_systemZone;
	//进程启动时间
	static time_t	s_sysStart;
	//时间戳偏移(秒)
	static time_t	s_timeOffset;
};

}
#endif
